package com.wh.wisdomsite.xbox.server.manager;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.wh.wisdomsite.xbox.ba.entity.Menu;
import com.wh.wisdomsite.xbox.ba.service.IMenuService;
import com.wh.wisdomsite.xbox.utils.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * MenuMapManager
 * 用于在应用启动时在内存中创建menuMap，并从数据库中查询出所有的menu保存在menuMap中，作为系统缓存，在
 * 生成系统日志的时候，方便直接从内存中查询出所有的菜单
 *
 * @version V1.0
 * @Package: com.wh.wisdomsite.xbox.server.manager
 * @author: 丁奕
 * @date: 2018-10-30 09:32
 * @Copyright 公司版权所有
 * @Company 贵州万华科技有限公司Copyright (c) 2016
 **/
public class MenuMapManager extends HttpServlet {
    private static final Log logger = LogFactory.getLog(MenuMapManager.class);

    private static Map<String, Menu> menuMap = new HashMap<>();

    @Autowired
    private IMenuService iMenuService;

    @Override
    public void init(ServletConfig config) {
        logger.debug("================>[MenuMapManager]自动加载启动开始.");
        try {
            super.init();
            SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());
        } catch (ServletException e) {
            e.printStackTrace();
        }
        // 读取用户表中数据，存放入内存中用map管理
        EntityWrapper<Menu> ew = new EntityWrapper<>();
        ew.setEntity(new Menu());
        List<Menu> menuList = iMenuService.selectList(ew);
        if(menuList != null && !menuList.isEmpty()){
            for (Menu menu : menuList){
                menuMap.put(menu.getMeId(), menu);
                if(menu.getPermission() != null && StringUtils.isNotEmpty(menu.getPermission())){
                    menuMap.put(menu.getPermission(), menu);
                }
            }
        }
        logger.debug("================>[MenuMapManager]自动加载启动结束.");
    }

    public static Map<String, Menu> getMenuMap() {
        return menuMap;
    }

    /**
     * 在menuMap中更新menu（添加或者修改）
     * @param menu
     */
    public static void updateMenuToMap(Menu menu){
        if(menu.getMeId() != null && !menu.getMeId().equals("")){
            menuMap.put(menu.getMeId(), menu);
            if(menu.getPermission() != null && StringUtils.isNotEmpty(menu.getPermission())){
                menuMap.put(menu.getPermission(), menu);
            }
        }
    }

    /**
     * 根据id删除map中的menu
     * @param id
     */
    public static void remove(String id){
        if(id != null && !id.equals("")){
            Menu menu = menuMap.get(id);
            if(menu != null && menu.getPermission() != null && StringUtils.isNotEmpty(menu.getPermission())){
                menuMap.remove(menu.getPermission());
            }
            menuMap.remove(id);
        }
    }

    /**
     * 根据传入的permission在menuMap中获取menu
     * @param permission
     * @return
     */
    public static Menu getMenuInMap(String permission){
        Menu menu = null;
        if(menuMap.containsKey(permission)){
            menu = menuMap.get(permission);
        }
        return menu;
    }
}
